/*
 * (C) 2009, Elephant Seven Hamburg Gmbh, 
 * Author: Detlev Wiese
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
 * use this file except in compliance with the License. You may obtain a copy 
 * of the License at
 *  
 *     http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.se and its accompanying notice file is
 * included with the distribution. 
 */ 
package com.e7.streams;

/**
 * <P>A stream wrapper class which has {@code synchronized} next() 
 * and hasNext() method declarations. Method calls are forwarded to 
 * the wrapped instances, but they execute with mutual exclusion to 
 * other threads.</P> 
 * <P>If more than one thread is accessing elements from the same 
 * stream object, it is not safe to assume that {code @next()} and 
 * {@code hasNext()} behave consistently as defined by the 
 * {@link java.util.Iterator}-interface.<P>
 * <P>When multiple threads read from the same stream, they might want 
 * to be prepared to catch {@code NoSuchElementException}s, which signal 
 * that a stream has been read past its end.</P> 
 * @param <E> The element type of the stream wrapped.
 */
public class SynchronizedStream<E> extends WrappedStream<E> {
	
	/**
	 * Create an instance which wrapps the stream given with synchronized
	 * method-signatures of {@link Stream}! 
	 * @param stream The stream to wrap
	 */
	public SynchronizedStream(Stream<E> stream) {
		super(stream);
	}

	/**
	 * {@inheritDoc}
	 * <P>Note: this method executes {@code synchronized}.</P>
	 */
	public synchronized boolean hasNext() { 
		return super.hasNext(); 
	} 
	
	/**
	 * {@inheritDoc}
	 * <P>Note: this method executes {@code synchronized}.</P>
	 */
	public synchronized E next() { 
		return super.next(); 
	} 
}
